home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Online / SpeakFreely / src / libdes / DES.xs < prev    next >
Text File  |  2000-05-18  |  4KB  |  269 lines

  1. #include "EXTERN.h"
  2. #include "perl.h"
  3. #include "XSUB.h"
  4. #include "des.h"
  5.  
  6. #define deschar    char
  7. static STRLEN len;
  8.  
  9. static int
  10. not_here(s)
  11. char *s;
  12. {
  13.     croak("%s not implemented on this architecture", s);
  14.     return -1;
  15. }
  16.  
  17. MODULE = DES    PACKAGE = DES    PREFIX = des_
  18.  
  19. char *
  20. des_crypt(buf,salt)
  21.     char *    buf
  22.     char *    salt
  23.  
  24. void
  25. des_set_odd_parity(key)
  26.     des_cblock *    key
  27. PPCODE:
  28.     {
  29.     SV *s;
  30.  
  31.     s=sv_newmortal();
  32.     sv_setpvn(s,(char *)key,8);
  33.     des_set_odd_parity((des_cblock *)SvPV(s,na));
  34.     PUSHs(s);
  35.     }
  36.  
  37. int
  38. des_is_weak_key(key)
  39.     des_cblock *    key
  40.  
  41. des_key_schedule
  42. des_set_key(key)
  43.     des_cblock *    key
  44. CODE:
  45.     des_set_key(key,RETVAL);
  46. OUTPUT:
  47. RETVAL
  48.  
  49. des_cblock
  50. des_ecb_encrypt(input,ks,encrypt)
  51.     des_cblock *    input
  52.     des_key_schedule *    ks
  53.     int    encrypt
  54. CODE:
  55.     des_ecb_encrypt(input,&RETVAL,*ks,encrypt);
  56. OUTPUT:
  57. RETVAL
  58.  
  59. void
  60. des_cbc_encrypt(input,ks,ivec,encrypt)
  61.     char *    input
  62.     des_key_schedule *    ks
  63.     des_cblock *    ivec
  64.     int    encrypt
  65. PPCODE:
  66.     {
  67.     SV *s;
  68.     STRLEN len,l;
  69.     char *c;
  70.  
  71.     l=SvCUR(ST(0));
  72.     len=((((unsigned long)l)+7)/8)*8;
  73.     s=sv_newmortal();
  74.     sv_setpvn(s,"",0);
  75.     SvGROW(s,len);
  76.     SvCUR_set(s,len);
  77.     c=(char *)SvPV(s,na);
  78.     des_cbc_encrypt((des_cblock *)input,(des_cblock *)c,
  79.         l,*ks,ivec,encrypt);
  80.     sv_setpvn(ST(2),(char *)c[len-8],8);
  81.     PUSHs(s);
  82.     }
  83.  
  84. void
  85. des_cbc3_encrypt(input,ks1,ks2,ivec1,ivec2,encrypt)
  86.     char *    input
  87.     des_key_schedule *    ks1
  88.     des_key_schedule *    ks2
  89.     des_cblock *    ivec1
  90.     des_cblock *    ivec2
  91.     int    encrypt
  92. PPCODE:
  93.     {
  94.     SV *s;
  95.     STRLEN len,l;
  96.  
  97.     l=SvCUR(ST(0));
  98.     len=((((unsigned long)l)+7)/8)*8;
  99.     s=sv_newmortal();
  100.     sv_setpvn(s,"",0);
  101.     SvGROW(s,len);
  102.     SvCUR_set(s,len);
  103.     des_3cbc_encrypt((des_cblock *)input,(des_cblock *)SvPV(s,na),
  104.         l,*ks1,*ks2,ivec1,ivec2,encrypt);
  105.     sv_setpvn(ST(3),(char *)ivec1,8);
  106.     sv_setpvn(ST(4),(char *)ivec2,8);
  107.     PUSHs(s);
  108.     }
  109.  
  110. void
  111. des_cbc_cksum(input,ks,ivec)
  112.     char *    input
  113.     des_key_schedule *    ks
  114.     des_cblock *    ivec
  115. PPCODE:
  116.     {
  117.     SV *s1,*s2;
  118.     STRLEN len,l;
  119.     des_cblock c;
  120.     unsigned long i1,i2;
  121.  
  122.     s1=sv_newmortal();
  123.     s2=sv_newmortal();
  124.     l=SvCUR(ST(0));
  125.     des_cbc_cksum((des_cblock *)input,(des_cblock *)c,
  126.         l,*ks,ivec);
  127.     i1=c[4]|(c[5]<<8)|(c[6]<<16)|(c[7]<<24);
  128.     i2=c[0]|(c[1]<<8)|(c[2]<<16)|(c[3]<<24);
  129.     sv_setiv(s1,i1);
  130.     sv_setiv(s2,i2);
  131.     sv_setpvn(ST(2),(char *)c,8);
  132.     PUSHs(s1);
  133.     PUSHs(s2);
  134.     }
  135.  
  136. void
  137. des_cfb_encrypt(input,numbits,ks,ivec,encrypt)
  138.     char *    input
  139.     int    numbits
  140.     des_key_schedule *    ks
  141.     des_cblock *    ivec
  142.     int    encrypt
  143. PPCODE:
  144.     {
  145.     SV *s;
  146.     STRLEN len;
  147.     char *c;
  148.  
  149.     len=SvCUR(ST(0));
  150.     s=sv_newmortal();
  151.     sv_setpvn(s,"",0);
  152.     SvGROW(s,len);
  153.     SvCUR_set(s,len);
  154.     c=(char *)SvPV(s,na);
  155.     des_cfb_encrypt((unsigned char *)input,(unsigned char *)c,
  156.         (int)numbits,(long)len,*ks,ivec,encrypt);
  157.     sv_setpvn(ST(3),(char *)ivec,8);
  158.     PUSHs(s);
  159.     }
  160.  
  161. des_cblock *
  162. des_ecb3_encrypt(input,ks1,ks2,encrypt)
  163.     des_cblock *    input
  164.     des_key_schedule *    ks1
  165.     des_key_schedule *    ks2
  166.     int    encrypt
  167. CODE:
  168.     {
  169.     des_cblock c;
  170.  
  171.     des_3ecb_encrypt((des_cblock *)input,(des_cblock *)&c,
  172.         *ks1,*ks2,encrypt);
  173.     RETVAL= &c;
  174.     }
  175. OUTPUT:
  176. RETVAL
  177.  
  178. void
  179. des_ofb_encrypt(input,numbits,ks,ivec)
  180.     unsigned char *    input
  181.     int    numbits
  182.     des_key_schedule *    ks
  183.     des_cblock *    ivec
  184. PPCODE:
  185.     {
  186.     SV *s;
  187.     STRLEN len,l;
  188.     unsigned char *c;
  189.  
  190.     len=SvCUR(ST(0));
  191.     s=sv_newmortal();
  192.     sv_setpvn(s,"",0);
  193.     SvGROW(s,len);
  194.     SvCUR_set(s,len);
  195.     c=(unsigned char *)SvPV(s,na);
  196.     des_ofb_encrypt((unsigned char *)input,(unsigned char *)c,
  197.         numbits,len,*ks,ivec);
  198.     sv_setpvn(ST(3),(char *)ivec,8);
  199.     PUSHs(s);
  200.     }
  201.  
  202. void
  203. des_pcbc_encrypt(input,ks,ivec,encrypt)
  204.     char *    input
  205.     des_key_schedule *    ks
  206.     des_cblock *    ivec
  207.     int    encrypt
  208. PPCODE:
  209.     {
  210.     SV *s;
  211.     STRLEN len,l;
  212.     char *c;
  213.  
  214.     l=SvCUR(ST(0));
  215.     len=((((unsigned long)l)+7)/8)*8;
  216.     s=sv_newmortal();
  217.     sv_setpvn(s,"",0);
  218.     SvGROW(s,len);
  219.     SvCUR_set(s,len);
  220.     c=(char *)SvPV(s,na);
  221.     des_pcbc_encrypt((des_cblock *)input,(des_cblock *)c,
  222.         l,*ks,ivec,encrypt);
  223.     sv_setpvn(ST(2),(char *)c[len-8],8);
  224.     PUSHs(s);
  225.     }
  226.  
  227. des_cblock *
  228. des_random_key()
  229. CODE:
  230.     {
  231.     des_cblock c;
  232.  
  233.     des_random_key(c);
  234.     RETVAL=&c;
  235.     }
  236. OUTPUT:
  237. RETVAL
  238.  
  239. des_cblock *
  240. des_string_to_key(str)
  241. char *    str
  242. CODE:
  243.     {
  244.     des_cblock c;
  245.  
  246.     des_string_to_key(str,&c);
  247.     RETVAL=&c;
  248.     }
  249. OUTPUT:
  250. RETVAL
  251.  
  252. void
  253. des_string_to_2keys(str)
  254. char *    str
  255. PPCODE:
  256.     {
  257.     des_cblock c1,c2;
  258.     SV *s1,*s2;
  259.  
  260.     des_string_to_2keys(str,&c1,&c2);
  261.     EXTEND(sp,2);
  262.     s1=sv_newmortal();
  263.     sv_setpvn(s1,(char *)c1,8);
  264.     s2=sv_newmortal();
  265.     sv_setpvn(s2,(char *)c2,8);
  266.     PUSHs(s1);
  267.     PUSHs(s2);
  268.     }
  269.